/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef HKS_TEST_COMMON_H
#define HKS_TEST_COMMON_H

// #include "hks_type.h"
// #include "securec.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

// #define GOTO_ERROR_IF_FAIL(ret, err) \
//     if ((ret) != 0) { \
//         goto err; \
//     }

// #define GOTO_ERROR_IF_SUCCESS(ret, err) \
//     if ((ret) == 0) { \
//         goto err; \
//     }

// #define HKS_SLICE_MAX_LEN  64 * 1024

// #define DEFAULT_TEST_CASE_ID 0xFFFFFFFF
// #define DEFAULT_EXECUTION_TIMES 0xFFFFFFFF
// #define DEFAULT_PERFORM_TIMES 0xFFFFFFFF

// #define MAX_ARGS_LEN 20
// #define DEFAULT_KEY_ALIAS_SIZE 64
// #define DEFAULT_SLICE_SIZE (2 * 128 + 1)

// #define DEFAULT_PARAM_SET_OUT_SIZE 4096
// #define HKS_MAX_RANDOM_LEN 1024
// #define MAX_OUT_BLOB_SIZE (5 * 1024 * 1024)

// #define TEST_MAX_FILE_NAME_LEN 512

// #define DEFAULT_LOCAL_KEY_SIZE 256

// /* inputparams: struct HksBlob *blob */
// struct HksTestBlobParams {
//     bool blobExist;              /* blob null or not */
//     uint32_t blobSize;           /* blob->size value */
//     bool blobDataExist;          /* blob->data null or not */
//     uint32_t blobDataSize;       /* blob->data malloc size */
// };

// /* inputparams: struct HksParamSet *paramSet */
// struct HksTestGenKeyParamsParamSet {
//     bool paramSetExist;          /* paramSet null or not */
//     bool setAlg;
//     uint32_t alg;
//     bool setKeySize;
//     uint32_t keySize;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
//     bool setPadding;
//     uint32_t padding;
//     bool setBlockMode;
//     uint32_t mode;
//     bool setKeyStorageFlag;
//     uint32_t keyStorageFlag;
// };

// struct HksTestGenKeyParamsParamSetOut {
//     bool paramSetExist;          /* paramSet null or not */
//     uint32_t paramSetSize;
// };

// enum HksTestCipherType {
//     HKS_TEST_CIPHER_TYPE_AES,
//     HKS_TEST_CIPHER_TYPE_RSA,
// };

// struct TestRsaCipherParamSet {
//     struct HksParamSet **outParamSet;
//     bool paramSetExist;
//     bool setAlg;
//     uint32_t alg;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
//     bool setPadding;
//     uint32_t padding;
// };

// struct HksTestCipherParamsParamSet {
//     enum HksTestCipherType cipherType;
//     bool paramSetExist;          /* paramSet null or not */
//     bool setAlg;
//     uint32_t alg;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
//     bool setPadding;
//     uint32_t padding;
//     bool setBlockMode;
//     uint32_t mode;
//     bool setIv;
//     uint32_t ivSize;
//     bool setNonce;
//     uint32_t nonceSize;
//     bool setAad;
//     uint32_t aadSize;
//     bool setIsKeyAlias;
//     bool isKeyAlias;
// };

// struct HksTestMacParamSet {
//     bool paramSetExist;          /* paramSet null or not */
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
// };

// struct HksTestDeriveParamSet {
//     bool paramSetExist;          /* paramSet null or not */
//     bool setAlg;
//     uint32_t alg;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
//     bool setIteration;
//     uint32_t iteration;
//     bool setSalt;
//     uint32_t saltSize;
//     bool setInfo;
//     uint32_t infoSize;
//     bool setIsKeyAlias;
//     bool isKeyAlias;
// };

// struct HksTestAgreeParamSet {
//     bool paramSetExist;          /* paramSet null or not */
//     bool setAlg;
//     uint32_t alg;
//     bool setKeySize;
//     uint32_t keySize;
//     bool setIsKeyAlias;
//     bool isKeyAlias;
// };

// enum HksTestMacType {
//     HKS_TEST_MAC_TYPE_REE,
//     HKS_TEST_MAC_TYPE_TEE,
// };

// struct HksTestHashParamsParamSet {
//     bool paramSetExist;          /* paramSet null or not */
//     bool setDigest;
//     uint32_t digest;
// };

// struct HksTestParamSetOut {
//     bool paramSetExist;
//     uint32_t paramSetSize;
//     uint32_t realParamSetSize;
// };

// struct HksTestGenKeyParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestBlobParams keyAliasParams;
//     struct HksTestGenKeyParamsParamSet paramSetParams;
//     struct HksTestGenKeyParamsParamSetOut paramSetParamsOut;
// };

// struct HksTestCipherParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestBlobParams keyAliasParams;
//     struct HksTestGenKeyParamsParamSet genKeyParamSetParams;
//     struct HksTestGenKeyParamsParamSetOut genKeyParamSetParamsOut;
//     struct HksTestCipherParamsParamSet encryptParamSetParams;
//     struct HksTestCipherParamsParamSet decryptParamSetParams;
//     struct HksTestBlobParams plainTextParams;
//     struct HksTestBlobParams cipherTextParams;
//     struct HksTestBlobParams decryptedTextParams;
//     struct HksTestBlobParams localKeyParams;
// };

// struct HksTestEncryptParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestBlobParams keyAliasParams;
//     struct HksTestGenKeyParamsParamSet genKeyParamSetParams;
//     struct HksTestBlobParams encryptAliasParams;
//     struct HksTestCipherParamsParamSet encryptParamSetParams;
//     struct HksTestBlobParams inDataParams;
//     struct HksTestBlobParams outDataParams;
//     struct HksTestBlobParams localKeyParams;
// };

// struct HksTestDecryptParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestBlobParams keyAliasParams;
//     struct HksTestGenKeyParamsParamSet genKeyParamSetParams;
//     struct HksTestBlobParams decryptAliasParams;
//     struct HksTestCipherParamsParamSet decryptParamSetParams;
//     struct HksTestBlobParams inDataParams;
//     struct HksTestBlobParams outDataParams;
//     struct HksTestBlobParams localKeyParams;
// };

// struct HksTestMacParams {
//     uint32_t testId;
//     int32_t expectResult;
//     enum HksTestMacType macType;
//     struct HksTestBlobParams keyAliasParams;
//     struct HksTestGenKeyParamsParamSet genKeyParamSetParams;
//     struct HksTestBlobParams keyParams;
//     struct HksTestMacParamSet macParamSetParams;
//     struct HksTestBlobParams srcDataParams;
//     struct HksTestBlobParams macParams;
// };

// struct HksTestDeriveParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestBlobParams keyAliasParams;
//     struct HksTestGenKeyParamsParamSet genKeyParamSetParams;
//     struct HksTestBlobParams masterKeyParams;
//     struct HksTestDeriveParamSet deriveParamSetParams;
//     struct HksTestBlobParams derivedKeyParams;
//     struct HksTestBlobParams localKeyParams;
// };

// struct HksTestKeyExistParams {
//     uint32_t testId;
//     int32_t expectResult;
//     bool isGenKey;
//     struct HksTestBlobParams keyAliasParams;
// };

// struct HksTestGetKeyParamSetParams {
//     uint32_t testId;
//     int32_t expectResult;
//     bool isGenKey;
//     struct HksTestBlobParams keyAliasParams;
//     struct HksTestParamSetOut paramSetOutParams;
// };

// struct HksTestGenRandomParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestBlobParams randomParams;
// };

// struct HksTestHashParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestHashParamsParamSet paramSetParams;
//     struct HksTestBlobParams srcDataParams;
//     struct HksTestBlobParams hashParams;
// };

// struct HksTestBnExpModParams {
//     uint32_t testId;
//     int32_t expectResult;
//     bool isTestValue;
//     struct HksTestBlobParams xParams;
//     struct HksTestBlobParams aParams;
//     struct HksTestBlobParams eParams;
//     struct HksTestBlobParams nParams;
// };

// struct HksTestAgreeParams {
//     uint32_t testId;
//     int32_t expectResult;
//     struct HksTestBlobParams keyAlias1Params;
//     struct HksTestBlobParams keyAlias2Params;
//     struct HksTestGenKeyParamsParamSet genKeyParamSetParams;
//     struct HksTestBlobParams privateKeyParams;
//     struct HksTestAgreeParamSet agreeParamSetParams;
//     struct HksTestBlobParams peerPublicParams;
//     struct HksTestBlobParams agreedKeyParams;
//     struct HksTestBlobParams localPrivateKeyParams;
//     struct HksTestBlobParams localPublicKeyParams;
// };

// struct TestAgreeParamSetStructure {
//     struct HksParamSet **outParamSet;
//     bool paramSetExist;
//     bool setAlg;
//     uint32_t alg;
//     bool setKeySize;
//     uint32_t keySize;
//     bool setIsKeyAlias;
//     bool isKeyAlias;
// };

// struct GenerateKeyParamSetStructure {
//     struct HksParamSet **outParamSet;
//     bool paramSetExist;
//     bool setAlg;
//     uint32_t alg;
//     bool setKeySize;
//     uint32_t keySize;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
//     bool setPadding;
//     uint32_t padding;
//     bool setBlockMode;
//     uint32_t mode;
//     bool setKeyStorageFlag;
//     uint32_t keyStorageFlag;
// };

// struct AesCipherParamSetStructure {
//     struct HksParamSet **outParamSet;
//     bool paramSetExist;
//     bool setAlg;
//     uint32_t alg;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setPadding;
//     uint32_t padding;
//     bool setBlockMode;
//     uint32_t mode;
//     bool setIv;
//     const struct HksBlob *ivBlob;
//     bool setNonce;
//     const struct HksBlob *nonceBlob;
//     bool setAad;
//     const struct HksBlob *aadBlob;
//     bool setIsKeyAlias;
//     bool isKeyAlias;
// };

// struct TestMacParamSetStructure {
//     struct HksParamSet **outParamSet;
//     bool paramSetExist;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
//     bool setKeyAlias;
//     bool isKeyAlias;
// };

// struct TestDeriveParamSetStructure {
//     struct HksParamSet **outParamSet;
//     bool paramSetExist;
//     bool setAlg;
//     uint32_t alg;
//     bool setPurpose;
//     uint32_t purpose;
//     bool setDigest;
//     uint32_t digest;
//     bool setIteration;
//     uint32_t iteration;
//     bool setSalt;
//     const struct HksBlob *saltBlob;
//     bool setInfo;
//     const struct HksBlob *infoBlob;
//     bool setIsKeyAlias;
//     bool isKeyAlias;
// };

// #ifdef __cplusplus
// extern "C" {
// #endif

// void TestFreeBlob(struct HksBlob **key);

// int32_t TestConstuctBlob(struct HksBlob **blob,
//     bool blobExist,
//     uint32_t blobSize,
//     bool blobDataExist,
//     uint32_t realBlobDataSize);

// int32_t TestConstructGenerateKeyParamSetOut(
//     struct HksParamSet **outParamSet,
//     bool paramSetExist, uint32_t paramSetSize);

// int32_t TestConstructGenerateKeyParamSet(struct GenerateKeyParamSetStructure *paramStruct);

// int32_t TestConstructRsaCipherParamSet(struct TestRsaCipherParamSet *paramStruct);

// int32_t TestConstructAesCipherParamSet(struct AesCipherParamSetStructure *paramStruct);

// int32_t TestConstructMacParamSet(struct TestMacParamSetStructure *paramStruct);

// int32_t TestConstructAgreeParamSet(struct TestAgreeParamSetStructure *paramStruct);

// int32_t GenerateLocalX25519Key(struct HksBlob **privateKey, struct HksBlob **publicKey,
//     const struct HksTestBlobParams *localPrivateKeyParams, const struct HksTestBlobParams *localPublicKeyParams);

// int32_t TestConstructDeriveParamSet(struct TestDeriveParamSetStructure *paramStruct);

// int32_t TestConstructHashParamSet(
//     struct HksParamSet **outParamSet,
//     bool paramSetExist,
//     bool setDigest, uint32_t digest);

// int32_t HuksGenerateKey(struct HksBlob **keyAlias, const struct HksTestBlobParams *keyAliasParams,
//     const struct HksTestGenKeyParamsParamSet *genKeyParamSetParams,
//     const struct HksTestGenKeyParamsParamSetOut *genKeyParamSetParamsOut);

// int32_t GenerateLocalRandomKey(struct HksBlob **keyAlias, const struct HksTestBlobParams *localKeyParams);

// int32_t TestConstructBlobOut(struct HksBlob **blob,
//     bool blobExist,
//     uint32_t blobSize,
//     bool blobDataExist,
//     uint32_t realBlobDataSize);

// int32_t TestGenDefaultKeyAndGetAlias(struct HksBlob **keyAlias);

#ifdef __cplusplus
}
#endif

#endif /* HKS_TEST_COMMON_H */
